/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { RealConnection } from "../connection/RealConnection"
import { Request } from '../Request'
import { Headers } from "../Headers"
import { Response, ResponseBuilder } from "../Response"
import { Source } from "../okio/Source"
import { Sink } from "../okio/Sink"

export const DISCARD_STREAM_TIMEOUT_MILLIS = 100
/** Encodes HTTP requests and decodes HTTP responses. */
export interface ExchangeCodec {
    /** Returns the connection that carries this codec. */
    connection: RealConnection

    /** Returns an output stream where the request body can be streamed. */
    // @Throws(IOException::class)
    createRequestBody(request: Request, contentLength: number): Sink

    /** This should update the HTTP engine's sentRequestMillis field. */
    // @Throws(IOException::class)
    writeRequestHeaders(request: Request)

    /** Flush the request to the underlying socket. */
    // @Throws(IOException::class)
    flushRequest()

    /** Flush the request to the underlying socket and signal no more bytes will be transmitted. */
    // @Throws(IOException::class)
    finishRequest()

    /**
     * Parses bytes of a response header from an HTTP transport.
     *
     * @param expectContinue true to return null if this is an intermediate response with a "100"
     * response code. Otherwise this method never returns null.
     */
    // @Throws(IOException::class)
    readResponseHeaders(expectContinue: boolean): Promise<ResponseBuilder | null>

    // @Throws(IOException::class)
    reportedContentLength(response: Response): number

    // @Throws(IOException::class)
    openResponseBodySource(response: Response): Source

    /** Returns the trailers after the HTTP response. May be empty. */
    // @Throws(IOException::class)
    trailers(): Headers

    /**
     * Cancel this stream. Resources held by this stream will be cleaned up, though not synchronously.
     * That may happen later by the connection pool thread.
     */
    cancel()

}
